css: Track the tree selector matches
authorAlexander Larsson <alexl@redhat.com>
Thu, 29 Nov 2012 14:29:14 +0000 (15:29 +0100)
committerAlexander Larsson <alexl@redhat.com>
Fri, 30 Nov 2012 13:53:30 +0000 (14:53 +0100)
gtk/gtkcssprovider.c
gtk/gtkcssselector.c
gtk/gtkcssselectorprivate.h

index 88a1bd46967d845f6dc74c010a7713567d6debf4..358fed253825af599382b898f8b3ed21600bc64c 100644 (file)
@@ -986,6 +986,7 @@ struct _WidgetPropertyValue {
 struct GtkCssRuleset
 {
   GtkCssSelector *selector;
+  GtkCssSelectorTree *selector_match;
   WidgetPropertyValue *widget_style;
   PropertyValue *styles;
   GtkBitmask *set_styles;
@@ -2429,6 +2430,7 @@ gtk_css_provider_postprocess (GtkCssProvider *css_provider)
 
       _gtk_css_selector_tree_builder_add (builder,
                                          ruleset->selector,
+                                         &ruleset->selector_match,
                                          ruleset);
     }
 
index 626b28aa7d56ba155c910f72596b6b173bb00f39..2ede3b437c52ff09810c936a715eb856a0419bae 100644 (file)
@@ -1691,6 +1691,7 @@ _gtk_css_selector_tree_free (GtkCssSelectorTree *tree)
 typedef struct {
   gpointer match;
   GtkCssSelector *current_selector;
+  GtkCssSelectorTree **selector_match;
 } GtkCssSelectorRuleSetInfo;
 
 
@@ -1755,6 +1756,8 @@ subdivide_infos (GList *infos, GtkCssSelectorTree *parent)
              if (exact_matches == NULL)
                exact_matches = g_ptr_array_new ();
              g_ptr_array_add (exact_matches, info->match);
+             if (info->selector_match != NULL)
+               *info->selector_match = tree;
            }
          else
            matched = g_list_prepend (matched, info);
@@ -1800,12 +1803,14 @@ _gtk_css_selector_tree_builder_free  (GtkCssSelectorTreeBuilder *builder)
 void
 _gtk_css_selector_tree_builder_add (GtkCssSelectorTreeBuilder *builder,
                                    GtkCssSelector            *selectors,
+                                   GtkCssSelectorTree       **selector_match,
                                    gpointer                   match)
 {
   GtkCssSelectorRuleSetInfo *info = g_new0 (GtkCssSelectorRuleSetInfo, 1);
 
   info->match = match;
   info->current_selector = selectors;
+  info->selector_match = selector_match;
   builder->infos = g_list_prepend (builder->infos, info);
 }
 
index e4c09976d5b54f8d32d3ea3d035736cdd4aecd98..7d811b75d105a9ecd85f04fd3351075e68ebec23 100644 (file)
@@ -48,6 +48,7 @@ GPtrArray *_gtk_css_selector_tree_match_all (GtkCssSelectorTree *tree,
 GtkCssSelectorTreeBuilder *_gtk_css_selector_tree_builder_new   (void);
 void                       _gtk_css_selector_tree_builder_add   (GtkCssSelectorTreeBuilder *builder,
                                                                 GtkCssSelector            *selectors,
+                                                                GtkCssSelectorTree       **selector_match,
                                                                 gpointer                   match);
 GtkCssSelectorTree *       _gtk_css_selector_tree_builder_build (GtkCssSelectorTreeBuilder *builder);
 void                       _gtk_css_selector_tree_builder_free  (GtkCssSelectorTreeBuilder *builder);